package com.itheima.annotation;


import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.Properties;

/**
 * 写一个框架类 在不改变任何代码的前提下 创建任意对象并执行方法
 * 用注解实现
 */
@Pro(className = "com.itheima.annotation.Boy",methodName = "eat")
public class ReflectTest {
    public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        //获取注解对象
        Class<ReflectTest> reflectTestClass = ReflectTest.class;

        /**
         * 这个地方 注解是接口 但你执行这个操作的时候 会在内存中生成一个子类实现这个注解 并且将抽象方法实现 返回值即为你传进去的值
         */
        Pro annotation = reflectTestClass.getAnnotation(Pro.class);

        //获取注解属性中的两个值
        String className = annotation.className();
        String methodName = annotation.methodName();
        System.out.println(className);
        System.out.println(methodName);

        //将类加载进内存
        Class<?> aClass = Class.forName(className);
        Method declaredMethod = aClass.getDeclaredMethod(methodName);
        declaredMethod.setAccessible(true);
        declaredMethod.invoke(aClass.newInstance());

    }
}
